package handler

import (
	"oa-system/internal/api/request"
	"oa-system/internal/service"
	"oa-system/pkg/errors"
	"oa-system/pkg/response"
	"oa-system/pkg/utils"

	"github.com/gin-gonic/gin"
)

type RoleHandler struct {
	roleService service.RoleService
}

func NewRoleHandler(roleService service.RoleService) *RoleHandler {
	return &RoleHandler{
		roleService: roleService,
	}
}

// GetAllRoles godoc
// @Summary 获取角色列表
// @Description 获取所有角色信息，支持分页
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param pageSize query int false "每页数量" default(10)
// @Success 200 {object} response.Response{data=response.PageData{list=[]model.Role,total=int}}
// @Router /roles [get]
func (h *RoleHandler) GetAllRoles(c *gin.Context) {
	var req request.RoleListRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		response.Error(c, errors.NewBadRequestError("无效的请求参数", err))
		return
	}

	roles, total, err := h.roleService.GetAllRoles(req.Page, req.PageSize, req.Name)
	if err != nil {
		response.Error(c, err)
		return
	}

	response.PageSuccess(c, roles, total, req.Page, req.PageSize)
}

// GetRoleByID godoc
// @Summary 获取角色详情
// @Description 根据ID获取角色详细信息
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path uint true "角色ID"
// @Success 200 {object} response.Response{data=model.Role}
// @Router /roles/{id} [get]
func (h *RoleHandler) GetRoleByID(c *gin.Context) {
	id, err := utils.ParseUintParam(c, "id")
	if err != nil {
		response.Error(c, errors.NewBadRequestError("无效的角色ID", err))
		return
	}

	role, err := h.roleService.GetRoleByID(id)
	if err != nil {
		response.Error(c, err)
		return
	}

	response.Success(c, role)
}

// CreateRole godoc
// @Summary 创建角色
// @Description 创建新的角色
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param role body request.CreateRoleRequest true "角色信息"
// @Success 200 {object} response.Response{data=model.Role}
// @Router /roles [post]
func (h *RoleHandler) CreateRole(c *gin.Context) {
	var req request.CreateRoleRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, errors.NewBadRequestError("无效的请求参数", err))
		return
	}

	role, err := h.roleService.CreateRole(&req)
	if err != nil {
		response.Error(c, err)
		return
	}

	response.Success(c, role)
}

// UpdateRole godoc
// @Summary 更新角色
// @Description 更新指定角色的信息
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path uint true "角色ID"
// @Param role body request.UpdateRoleRequest true "角色信息"
// @Success 200 {object} response.Response{data=model.Role}
// @Router /roles/{id} [put]
func (h *RoleHandler) UpdateRole(c *gin.Context) {
	id, err := utils.ParseUintParam(c, "id")
	if err != nil {
		response.Error(c, errors.NewBadRequestError("无效的角色ID", err))
		return
	}

	var req request.UpdateRoleRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, errors.NewBadRequestError("无效的请求参数", err))
		return
	}

	role, err := h.roleService.UpdateRole(id, &req)
	if err != nil {
		response.Error(c, err)
		return
	}

	response.Success(c, role)
}

// DeleteRole godoc
// @Summary 删除角色
// @Description 删除指定的角色
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path uint true "角色ID"
// @Success 200 {object} response.Response
// @Router /roles/{id} [delete]
func (h *RoleHandler) DeleteRole(c *gin.Context) {
	id, err := utils.ParseUintParam(c, "id")
	if err != nil {
		response.Error(c, errors.NewBadRequestError("无效的角色ID", err))
		return
	}

	if err := h.roleService.DeleteRole(id); err != nil {
		response.Error(c, err)
		return
	}

	response.SuccessWithMessage(c, "角色删除成功", nil)
}

// AssignMenus godoc
// @Summary 分配菜单
// @Description 为指定角色分配菜单权限
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param request body request.AssignMenusRequest true "分配菜单请求参数"
// @Success 200 {object} response.Response
// @Router /roles/assignMenus [post]
func (h *RoleHandler) AssignMenus(c *gin.Context) {
	var req request.AssignMenusRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, errors.NewBadRequestError("无效的请求参数", err))
		return
	}

	// 检查角色是否存在
	if _, err := h.roleService.GetRoleByID(req.RoleID); err != nil {
		response.Error(c, errors.NewNotFoundError("角色不存在", err))
		return
	}

	if err := h.roleService.AssignMenusToRole(req.RoleID, req.MenuIDs); err != nil {
		response.Error(c, err)
		return
	}

	response.SuccessWithMessage(c, "菜单分配成功", nil)
}

// GetAssignedMenus godoc
// @Summary 获取已分配菜单
// @Description 获取指定角色已分配的菜单ID列表
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path uint true "角色ID"
// @Success 200 {object} response.Response{data=[]uint}
// @Router /roles/{id}/assignedMenus [get]
func (h *RoleHandler) GetAssignedMenus(c *gin.Context) {
	roleID, err := utils.ParseUintParam(c, "id")
	if err != nil {
		response.Error(c, errors.NewBadRequestError("无效的角色ID", err))
		return
	}

	menuIDs, err := h.roleService.GetAssignedMenuIDs(roleID)
	if err != nil {
		response.Error(c, err)
		return
	}

	response.Success(c, menuIDs)
}
